perm filename PART2[00,BGB] blob sn#098156 filedate 1974-04-24 generic text, type C, neo UTF8
COMMENT ⊗   VALID 00007 PAGES
C REC  PAGE   DESCRIPTION
C00001 00001
C00003 00002	
C00005 00003	3.0	WINGED EDGE PRIMITIVES.
C00043 00004	4.0	EULER MAKE PRIMITIVES.
C00045 00005	5.0	EULER KILL PRIMITIVES.
C00047 00006	7.0	EUCLIDEAN TRANSFORMATIONS.
C00050 00007	PART III
C00059 ENDMK
C⊗;

PART II - GEOMED AS A SAIL OR LISP ACCESSIBLE GRAPHICS COMMAND LANGUAGE.

1.0 Introduction to GEOMES and GEOMEL.
2.0 Memory, Control, Input and Output Routines.
	GEOMED MKUNIV MKNODE KLNODE
	MKWORLD MKCAMERA MKWINDOW 
	OUTB3D OUTGEM OUTCAM OUTVID
	INB3D  INGEM  INCAM  INCRE
3.0 Datum and Link Names:
	XWC YWC ZWC AA BB CC  XPP YPP ZPP
	IX IY IZ  JX JY JZ  KX KY KZ  
	NFACE PFACE NED PED NVT PVT DAD SON BRO SIS  
	ALT ALT2 CW CCW CAR8 CDR8
4.0 Winged Edged Primitives:
	MKB MKF MKE MKV MKFRAME
	WING INVERT EVERT
	ECW ECCW OTHER VCW VCCW FCW FCCW
	BDET BATT BGET
5.0 Euler Routines:
	MKBFV MKEV ESPLIT MKFE GLUEE
	KLBFEV KLFE KLEV UNGLUE
	GLUE MKCOPY SWEEP ROTCOM PYRAMID FVDUAL
	MKCUBE MKCYLN MKBALL
	BIN BUN BSUB MKCVEX 
	MKBUCK ECUT FCUT BCUT
6.0 Euclidean Routines:
	TRANSL ROTATE SHRINK APTRAN INTRAN DISTANCE
	NORM MKROT1 ORTHO1 ORTHO2 DETERM ANGL3V 
7.0 Image Forming Routines:
	GEODPY IIIDPY SHOW1 SHOW2 SHOW3 SHOW4 
	TAKE1 TAKE2 OCCULT SHADOW CLIPER
	VPROJ UNPROJ FACOEF ECOEF
8.0 Arithmetic and Display Routines:
	PI SQRT LOG SIN COS ATAN ATAN2 ASIN ACOS
	DPYBUF DPYSST DPYSET DPYBIG DPYBRT 
	AVECT AIVECT RVECT RIVECT DPYOUT
3.0	WINGED EDGE PRIMITIVES.


3.1	MKB,MKF,MKE,MKV,MKFRAME.	Make BFEV Nodes.
3.2 	WING,INVERT,EVERT		Make and change wing pointers.
3.3	LINKED				Find if two entities are linked.
3.4	ECW,ECCW,			Edge fetching around FV perimeter.
3.5 	OTHER,VCW,VCCW,FCW,FCCW		Face-vertex fetching from an edge.
3.6	BDET,BATT,BGET			Body parts linking and body get.
4.0	EULER MAKE PRIMITIVES.

4.1 	BNEW ← MKBFV;   	Make vertex polyhedron.
4.2 	VNEW ← MKEV(F,V);	MAKES NEW EDGE AND VERTEX SUCH THAT:
				VNEW = NVT(ENEW); V = PVT(ENEW);
	VNEW ← ESPLIT(E);	MAKES NEW EDGE AND VERTEX...
4.3 	ENEW ← MKFE(V1,F,V2);   MAKES NEW FACE AND EDGE SUCH THAT:
				FNEW = NFACE(ENEW); F = PFACE(ENEW);
				  V1 = PVT(ENEW);  V2 = NVT(ENEW).
4.4	ENEW ← GLUEE(F1,V1,F2,V2);	MAKES NEW EDGE, KILLS F2,
				AND MAKES A HOLE OR KILLS A BODY.
				  V1 = PVT(ENEW);  V2 = NVT(ENEW).

4.2	VNEW ← MKEV(FACE,VERTEX);
	VNEW ← ESPLIT(EDGE);

	Make a new  edge and a new vertex in  the given FACE from the
given VERTEX; the  new vertex is  return, VNEW; the  new edge can  be
accessed by taking PED(VNEW).
ESPLIT,	makes a new edge and a  new vertex, VNEW; the new edge may  be
obtained by taking PED(VNEW); the new  edge is place between VNEW and
PVT(EDGE).

4.3	ENEW ← MKFE(V1,FACE,V2);

	Make a new face and a new edge by  joining V1 and V2 of FACE.
The new  edge is returned, ENEW; the new  face may always be obtained
by taking NFACE(ENEW).
5.0	EULER KILL PRIMITIVES.

5.1 	QNEW ← KLBFEV(Q);	Kill entity.
5.2 	   F ← KLFE(E);		Kill E and NFACE(E), return PFACE(E).
5.3 	   E ← KLEV(V);		Kill V and PED(V), return other E of V.
	   V ← KLEV(E);		Kill E and NVT(E), retirn PVT(E).
5.4 	FNEW ← UNGLUE(E);	Undo an GLUEE.
.....................................................................
6.0	EASY POLYHEDRON ROUTINES.

6.1	BODY ←	GLUE(FACE1,FACE2);	Glue face-face.
6.2	QNEW ←	MKCOPY(ENTITY);		Make copy.
6.3	FACE ←	SWEEP(FACE,FLAG);	Sweep cylinder.
6.4	FACE ←	ROTCOM(FACE);		Rotation completion.
6.5	PEAK ←	PYRAMID(FV);		Make pyramid on a face (or vertex).
6.6	BODY ←  FVDUAL(BODY);		Make face/vertex dual of a body.
6.7	BNEW ←  MKCUBE(DX,DY,DZ);	Make right rectangular prism.
6.8	BNEW ←  MKCYLN(RADIUS,N,DZ);	Make right cylinder.
6.9	BNEW ←  MKBALL(RADIUS,M,N);	Make sphere approximation.

7.0	EUCLIDEAN TRANSFORMATIONS.

FRAME ← TRANSLATE(INTEGER ENTITY; REAL DELTAX,DELTAY,DELTAZ);
FRAME ←    ROTATE(INTEGER ENTITY; REAL ABOUTX,ABOUTY,ABOUTZ);
FRAME ←    SHRINK(INTEGER ENTITY; REAL SCALEX,SCALEY,SCALEZ);

	When  the  ENTITY argument  is  non-zero,  these  subroutines
perform   the   indicated   Euclidean  Transformation:   translation,
rotation, dilation and reflection. When the ENTITY argument  is ZERO,
then  a  FRAME  node   representing  the  desired  transformation  is
returned.

FRAMES and EUCLIDEAN TRANSFORMATIONS

	A frame  node  has two  intrepretations: it  may  be used  to
represent  a  frame of  reference  or it  may  be used  to  specify a
Euclidean transformation.

	As a frame of reference the XWC,  YWC, ZWC datums contain the
location  of the origin  of the frame  in world  coordinates; and the
remaining nine datums IX,IY,IZ, JX,JY,JZ, KX,KY,KZ are the components
of three  unit vectors  I, J,   and K that  determine a  right handed
rectangular  Cartesian coordinate system. The  nine components of the
unit vectors form an orthonormal rotation matrix.

	As a Euclidean transformation, the frame is applied to the
3-D world coordinates of an entity Q to make new coordinates.
---------------------------------------------------------------------
|  APTRAN's inner most subroutine.				    |
|  Expects arguments in V and Q. Clobbers 1,2,X,Y,Z.		    |
|								    |
|	X ← XWC(V);						    |
|	Y ← YWC(V);						    |
|	Z ← ZWC(V);					            |
|						 		    |
|	XWC(V) ← X*IX(Q) + Y*JX(Q) + Z*KX(Q) + XWC(Q);		    |
|	YWC(V) ← X*IY(Q) + Y*JY(Q) + Z*KZ(Q) + YWC(Q);		    |
|	ZWC(V) ← X*IZ(Q) + Y*JZ(Q) + Z*KZ(Q) + ZWC(Q);		    |
---------------------------------------------------------------------

HOMOGENEOUS COORDINATES

	The interpretation of frame nodes can be given in the
four by four notation of homogeneous coordinates.
PART III

SYSTEMS PROGRAMMING NOTES:

	The GEOMES source files  are all found on the disk area [GEM,HE];
the file  Z.CMD is an RPG command file  such that the monitor command
"COMPILE @Z.CMD" will compile everything.

MAKING A GEOMEL

.R ILISP 50
---------------------------------------------------------------------
DESCRIPTION OF GEOMED MACHINE CODE.

	The over all program structure of GEOMED is determined by the
urge  to have approximately one  subroutine per page  of source code.
The subroutine  calling  conventions are  SAIL like;  accumulator  17
(named  "P") is used  as  a  push down  list  for  arguments and  return
addresses; a calling sequence goes: PUSH P,ARG↔ PUSH P,ARG↔ ... PUSHJ
P,SUBR and  a subroutine  return must  fix  up the  stack SUB  P,[XWD
N+1,N+1] and JRST @N+1(P).
	
	The somewhat unusal  appearance of GEOMED machine code arises
from the  use  of  FAIL  assembler macros  to  implement  ALGOL  like
subroutine notation and KNUTH like datum/link  notation; and from the
use of double-arrow "↔"  to place more than one machine instruction per
line and  the use  of  seven alternate  PDP-10 mnemonics.

	The seven alternate PDP-10 mnemonics are LAC, DAC, CAR, CDR,
DIP,   DAP and GO for  MOVE, MOVEM, HLRZ,  HRRZ,  HRLM, HRRM and JRST
respectively. The LAC,  DAC, DIP, DAP  come from PDP-1  nomensclature
and are shorter  and more pronoucible than  their PDP-10 equivalents.
The  CAR and CDR are from LISP which  got them from the IBM-709.  The
GO comes from  ALGOL and is shorter  and more descriptive than  JRST.
The  PDP-10 op  code names  sacrifice  pronoucibility  for systematic
nomensclature; and although I once proposed having alternate  concise
euphonious names  for the most  frequently used operations;  the idea
was  quite unpopular and so  I have abandoned it for  all except the 
above seven mnemonics.